const cloud = require('wx-server-sdk');

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV // 使用当前环境
});

const db = cloud.database();

// 工具函数：将下划线命名转换为驼峰命名
const toCamelCase = (data) => {
  if (Array.isArray(data)) {
    // 如果是数组，递归处理每一项
    return data.map((item) => toCamelCase(item));
  } else if (data && typeof data === "object") {
    // 如果是对象，递归处理键
    return Object.keys(data).reduce((result, key) => {
      const camelKey = key.replace(/_([a-z])/g, (_, letter) =>
          letter.toUpperCase()
      ); // 将下划线命名转换为驼峰命名
      result[camelKey] = toCamelCase(data[key]); // 递归处理值
      return result;
    }, {});
  } else {
    // 如果是其他类型，直接返回
    return data;
  }
};

// 工具函数：格式化日期为 YYYY-MM-DD HH:MM:SS
function formatDateToYY_MM_DD_HH_MM_SS(date) {
  const offset = 8 * 60; // UTC+8
  const localDate = new Date(date.getTime() + offset * 60 * 1000);

  const year = localDate.getUTCFullYear();
  const month = String(localDate.getUTCMonth() + 1).padStart(2, '0');
  const day = String(localDate.getUTCDate()).padStart(2, '0');
  const hours = String(localDate.getUTCHours()).padStart(2, '0');
  const minutes = String(localDate.getUTCMinutes()).padStart(2, '0');
  const seconds = String(localDate.getUTCSeconds()).padStart(2, '0');

  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

// 获取投诉列表
async function getComplaintList(request) {
  const { page = 1, pageSize = 10, userId, orderId, orderType, productId, schoolCode } = request;

  try {
    // 初始化查询条件，确保只查询包含有效投诉信息的订单
    let queryCondition = {
      'complaint_info': db.command.and([
        db.command.neq(null), // 不为 null
        db.command.neq({}),   // 不为空对象
        {
          // 确保 text 或 images 至少有一个字段有值
          text: db.command.exists(true).or(db.command.neq("")),
        }
      ])
    };

    // 如果传入了订单号，则添加订单号的查询条件
    if (orderId) {
      queryCondition['order_id'] = orderId;
    }

    // 如果传入了用户ID，则添加用户ID的查询条件
    if (userId) {
      queryCondition['out_user_id'] = userId;
    }

    // 如果传了订单类型，则添加订单类型查询
    if (orderType) {
      queryCondition["order_item.product_id"] = orderType; // 使用字符串格式的嵌套字段
    }
    
    // 添加产品筛选支持
    if (productId) {
      queryCondition["order_item.product_id"] = productId;
    }

    // 添加学校代码筛选，确保学校间数据隔离
    if (schoolCode) {
      queryCondition['address.schoolCode'] = schoolCode;
    }

    // 查询满足条件的投诉信息，仅返回指定字段
    const query = db.collection('order')
      .where(queryCondition)
      .orderBy('complaint_info.camplaint_time', 'desc') // 按投诉时间倒序排序
      .skip((page - 1) * pageSize) // 分页跳过
      .limit(pageSize) // 每页大小
      .field({ // 指定只返回 order_id 和 complaint_info 字段
        order_id: true,
        complaint_info: true,
        address: true
      });

    const result = await query.get();

    // 统计满足条件的总记录数
    const total = await db.collection('order')
      .where(queryCondition)
      .count();

    const complaints = result.data.map((complaint) => {
      if (complaint.complaint_info.camplaint_time) {
        complaint.complaint_info.camplaint_time = formatDateToYY_MM_DD_HH_MM_SS(complaint.complaint_info.camplaint_time); // 格式化 create_ts
      }
      return complaint;
    });

    return {
      code: 200,
      message: '获取投诉信息成功',
      data: {
        complaints: toCamelCase(complaints), // 当前页数据，仅包含 order_id 和有效的 complaint_info
        total: total.total, // 总记录数
        page, // 当前页码
        pageSize // 每页大小
      }
    };
  } catch (err) {
    console.error('获取投诉信息失败：', err);
    return {
      code: 500,
      message: '获取投诉信息失败',
      data: null
    };
  }
}

// 保存投诉信息
async function saveComplaint(request) {
  const { orderId, complaintText, complaintImages } = request;

  // 参数校验
  if (!orderId || (!complaintText && (!complaintImages || complaintImages.length === 0))) {
    console.error('参数错误，orderId 和投诉内容或图片至少有一个不能为空');
    return {
      code: 400,
      message: '参数错误，orderId 和投诉内容或图片至少有一个不能为空',
      data: null,
    };
  }

  try {
    // 查询订单是否存在
    console.log('传入的 orderId:', orderId);
    const orderCheck = await db.collection('order').where({
      order_id: orderId,
    }).get();

    if (orderCheck.data.length === 0) {
      console.error('未找到订单，orderId:', orderId);
      return {
        code: 404,
        message: '未找到对应的订单',
        data: null,
      };
    }

    // 更新订单投诉信息
    const updateResult = await db.collection('order').where({
      order_id: orderId,
    }).update({
      data: {
        complaint_info: {
          text: complaintText || '',
          images: complaintImages || [],
          camplaint_time: new Date(),
          complaint_deal_status: '待处理',
        },
      },
    });

    console.log('更新结果:', updateResult);

    if (updateResult.stats.updated === 0) {
      console.error('未找到对应的订单或更新失败，orderId:', orderId);
      return {
        code: 404,
        message: '未找到对应的订单或更新失败',
        data: null,
      };
    }

    return {
      code: 200,
      message: '投诉信息保存成功',
      data: {
        orderId: orderId,
        complaintText: complaintText,
        complaintImages: complaintImages,
      },
    };
  } catch (error) {
    console.error('存储投诉信息失败：', error);
    return {
      code: 500,
      message: '投诉信息保存失败',
      data: null,
    };
  }
}

// 更新投诉状态
async function updateComplaintStatus(request) {
  const { orderId, complaintDealStatus } = request;

  // 检查参数
  if (!orderId) {
    console.error('参数错误，orderId 不能为空');
    return {
      code: 400,
      message: '参数错误，orderId 不能为空',
      data: null
    };
  }

  // 默认状态为"已处理"
  const status = complaintDealStatus || '已处理';

  try {
    // 更新订单的投诉状态
    const result = await db.collection('order').where({
      order_id: orderId // 根据订单号查询
    }).update({
      data: {
        'complaint_info.complaint_deal_status': status, // 更新投诉状态
        'complaint_info.complaint_solved_time': new Date() // 使用数据库服务器时间更新
      }
    });

    // 检查更新结果
    if (result.stats.updated === 0) {
      console.error('未找到对应的订单或更新失败');
      return {
        code: 404,
        message: '未找到对应的订单或更新失败',
        data: null
      };
    }

    return {
      code: 200,
      message: `投诉状态更新为${status}`,
      data: { orderId, status }
    };
  } catch (err) {
    console.error('更新投诉状态失败：', err);
    return {
      code: 500,
      message: '投诉状态更新失败',
      data: null
    };
  }
}

module.exports = {
  getComplaintList,
  saveComplaint,
  updateComplaintStatus
};
